<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet SYSTEM "entities.dtd">
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output media-type="text/html" method="html" encoding="utf-8" omit-xml-declaration="yes" doctype-public="HTML5"/> 

<!--
 | Main template
 -->
<xsl:template match="/doc">
<html>
<head>
<title>xmarty<xsl:apply-templates select="content/*" mode="title"/></title>
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico"/>
<link rel="stylesheet" type="text/css" href="/document.css"/>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script src="/document.js"></script>
</head>
<body>

<h1>xmarty</h1>

<ul class="menu">
<xsl:for-each select="/doc/i18n/menu/*">
    <li><a href="{name()}.php"><xsl:value-of select="."/></a></li>
</xsl:for-each>
</ul>

<div id="content">

<xsl:apply-templates select="content/*" mode="content"/>

</div>

<xsl:apply-templates select="stat"/>

</body>
</html>
</xsl:template>

<!--
 | Statistics
 -->
<xsl:template match="stat">
<div class="stat">
<xsl:value-of select="/doc/i18n/stat/time"/>: <xsl:value-of select="format-number(@time, '#0.000#')"/><xsl:text> </xsl:text><xsl:value-of select="/doc/i18n/stat/sec"/>;
<xsl:value-of select="/doc/i18n/stat/querys"/>: <xsl:value-of select="@querys"/>;
<xsl:value-of select="/doc/i18n/stat/memory"/>: <xsl:value-of select="format-number(@memory, '#0.###')"/><xsl:text> </xsl:text><xsl:value-of select="/doc/i18n/stat/mb"/>
</div>
</xsl:template>
<xsl:template match="/doc[production]/stat"/>

<!--
 | Default content templates
 -->
<xsl:template match="*" mode="title"/>

<xsl:template match="*" mode="content">
<h2><xsl:value-of select="/doc/i18n/error/title"/></h2>
<p><xsl:value-of select="/doc/i18n/error/not_template"/></p>
</xsl:template>

<!--
 | Message
 -->
<xsl:template match="message" mode="content">
<h2><xsl:value-of select="/doc/i18n/error/title"/></h2>
<xsl:value-of select="."/>
</xsl:template>

<!--
 | Index page
 -->
<xsl:template match="index[/doc/i18n/@lang='ru']" mode="content">
<p><strong>xmarty</strong> - минималистичный PHP фреймворк, использует XML/XSLT.</p>
<p>Особенности и возможности фреймворка:</p>
<ul>
<li>Работа с любым типом <strong>баз</strong> данных, поддерживаемых PDO.</li>
<li>Шаблонизация с использованием <strong>XSLT</strong>.</li>
<li>Отсутствие лишних PHP файлов, каждый файл является контроллером.</li>
<li>Интернационализация (<strong>i18n</strong>) в виде языковых XML файлов, используется и в PHP коде, и в XSLT шаблонах.</li>
<li>Используется <strong>UTF-8</strong> кодировка, в том числе и в базе данных.</li>
<li>Есть простая функция отправки электронных <strong>писем</strong>.</li>
<li>Возможен вывод <strong>статистики</strong> времени выполнения скриптов, занятой памяти, количества SQL запросов.</li>
<li>Малое потребление <strong>памяти</strong>, очень высокая <strong>скорость</strong> работы.</li>
<li>Можно устанавливать как в корень сайта, так и в любую директорию.</li>
<li>Очень мало файлов, и все они находятся в одной директории.</li>
</ul>
</xsl:template>

<!--
 | Download page
 -->
<xsl:template match="download" mode="title"> - Download</xsl:template>
<xsl:template match="download[/doc/i18n/@lang='ru']" mode="content">
<p>Лицензия: <a href="http://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D1%86%D0%B5%D0%BD%D0%B7%D0%B8%D0%B8_MIT">MIT</a>, используйте и изменяйте код как угодно.</p>
<p>Скачать исходный код: <a href="xmarty.zip">xmarty.zip</a> (15,1 Кб)</p>
<p>Google Code: <a href="http://code.google.com/p/xmarty/">http://code.google.com/p/xmarty/</a></p>
<p><code>svn checkout http://xmarty.googlecode.com/svn/trunk/ xmarty-read-only</code></p>
</xsl:template>

<!--
 | Docs page
 -->
<xsl:template match="docs" mode="title"> - Documentation</xsl:template>
<xsl:template match="docs[/doc/i18n/@lang='ru']" mode="content">
<p>Принцип работы основан на наполнении данными основного документа <code>SimpleXML $document</code>, и последующей XSTL трансформации.</p>
<p><pre><code>&lt;?php
if ( ! defined('ACTION')) define('ACTION', 'docs');

require_once('index.php');

function action_docs() {
    global $document, $content;
    $content->addChild('docs');
    <b>response</b>();
}

if (ACTION == 'docs') {
    action_docs();
}
</code></pre></p>
<p>Для работы с базой данных имеется несколько функций, которые покрывают все потребности.</p>
<p><code>sql_value($sql, $param)</code> - получение значения (или массива значений) первой записи, в качестве параметра выступает массив со значениями;</p>
<p><code>sql($sql, $param, $lastid)</code> - выполнение SQL запроса, при установленном третьем параметре в true, возвращает идентификатор последней добавленной записи;</p>
<p><code>sql_items($node, $sql, $param)</code> - результат запроса помещается в узел, указанный в первом параметре, каждая строка размещается в узел <code>&lt;item&gt;</code></p>
<p><code>sql_one($node, $sql, $param)</code> - результат запроса помещается в узел, указанный в первом параметре, обрабатывается только первая строка;</p>
<p><pre><code>function action_subscribe_send() {
    global $document;

    // Получить адрес электронной почты текущего пользователя
    $user_id = <b>get_post</b>('id');
    $email = <b>sql_value</b>('SELECT email FROM users WHERE id=?', array($user_id));

    // Получить список подписчиков, кроме текущего пользователя
    $subscribers = $document->content->addChild('subscribers');
    <b>sql_items</b>($subscribers, 'SELECT email FROM subscribers WHERE NOT email=?', array($email));

    // Рассылка писем подписчикам
    foreach ($subscribers->item as $subscriber) {
        $result = <b>send_mail</b>($email, $subscriber->email, 'Тема', 'Сообщение');
        $subscriber->addAttribute('result', $result ? 'true' : 'false');
    }

    // Вывод результата рассылки
    response('subscribers');
}</code></pre></p>
<p>Формирование документа происходит через методы:<br/>
<code>$document->addChild('node', htmlspecialchars('value'));</code><br/>
<code>$document->addAttribute('name', 'value');</code></p>
<p>XSTL трансформация документа и вывод результата в браузер производится функцией <code>response($name)</code>, в качестве параметра указывается имя XSLT шаблона (без расширения), по-умолчанию используется шаблон index.xslt</p>
<p>Также, для удобства работы, имеются следующие полезные функции:</p>
<p><code>get_post($name, $null)</code> - возвращает значение <code>$_POST[$name]</code>, второй параметр указывает на необходимость возвращать null в случае отсутствия данных;<br/>
<code>get_qs($name)</code> - возвращает значение <code>$_GET[$name]</code>;<br/>
<code>get_server($name)</code> - возвращает значение <code>$_SERVER[$name]</code>;<br/>
<code>get_cookie($name)</code> - возвращает значение <code>$_COOKIE[$name]</code>;</p>
<p><a href="download.php">Исходный код</a> проекта включает в себя код этого сайта, и сам является примером работы xmarty.</p>
</xsl:template>

</xsl:stylesheet>
